home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / windows / readfi11.zip / READFILE.CPP < prev    next >
C/C++ Source or Header  |  1996-05-05  |  6KB  |  247 lines

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "crc.h"
  6.  
  7. DWORD ReadAFile(char * pszBeginPath,char * fn,DWORD dwSizeFile,char * ptr,char * ptrcpy,
  8.                     DWORD dwSizeBlock,LPDWORD lpdwCrc,BOOL fList,BOOL fMap)
  9. {
  10. DWORD dwBeg,dwEnd,dwCount;
  11. DWORD dwRead;                 
  12. HANDLE hf;
  13. char szuseFn[MAX_PATH];
  14.   lstrcpy(szuseFn,pszBeginPath);
  15.   lstrcat(szuseFn,fn) ;
  16.   dwCount = 0;
  17.   dwBeg = GetTickCount();
  18.   //hf = _lopen(fn,OF_READ) ;
  19.   {
  20.   //SECURITY_ATTRIBUTES sa;
  21.   hf = CreateFile(szuseFn,GENERIC_READ,0,NULL,OPEN_EXISTING,
  22.                             FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING,
  23.                             NULL);
  24.   }
  25.  
  26.   if (lpdwCrc!=NULL)
  27.     {
  28.       //InitializeCRCTable();
  29.       *lpdwCrc = 0xFFFFFFFFL;
  30.     }
  31.  
  32.   if (hf !=INVALID_HANDLE_VALUE)
  33.     {
  34.       if (fMap)
  35.       {
  36.       HANDLE hFileMap;
  37.       PCHAR  pchFileBase;
  38.  
  39.           hFileMap = CreateFileMapping(hf, NULL, PAGE_READONLY, 0, 0, NULL);
  40.           pchFileBase = (PCHAR)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
  41.           if (lpdwCrc!=NULL)
  42.            *lpdwCrc = ComputeBufferCRC(*lpdwCrc,pchFileBase,dwSizeFile);
  43.           dwRead=dwSizeFile;
  44.           dwCount += dwRead;
  45.           UnmapViewOfFile(pchFileBase);
  46.           CloseHandle(hFileMap);
  47.       }
  48.       else
  49.       do
  50.        {         
  51.          dwRead=0;
  52.          ReadFile(hf,ptr,dwSizeBlock,&dwRead,NULL);
  53.          if (lpdwCrc!=NULL)
  54.            *lpdwCrc = ComputeBufferCRC(*lpdwCrc,ptr,dwRead);
  55.          if (ptrcpy != NULL)
  56.            memcpy(ptrcpy,ptr,dwRead);
  57.          dwCount += dwRead;
  58.       
  59.        } while (dwRead > 0);
  60.       CloseHandle(hf);
  61.     }
  62.  
  63.   dwEnd = GetTickCount();
  64.   if (!fList)
  65.        printf("File=%6u Kb/Sec with %9u bytes : %s",dwCount/(1+dwEnd-dwBeg),dwCount,fn);
  66.   else
  67.       printf("%s,%s,%s,%u",pszBeginPath,szuseFn,fn,dwCount);
  68.   if (lpdwCrc!=NULL)
  69.     {
  70.       *lpdwCrc = ((*lpdwCrc) ^= 0xFFFFFFFFL);
  71.       if (fList) printf(","); else printf(" ");
  72.       printf("Crc=%lX",*lpdwCrc);
  73.     }
  74.   printf("\n");
  75.   return dwCount;
  76. }
  77.  
  78. void testmem()
  79. {
  80. DWORD dwSize = 0x10000 * 0x10;
  81. char * base;
  82. char * ptr1;
  83. char * ptr2;
  84. int i;
  85. DWORD dwBeg,dwEnd;
  86. DWORD dwBegA,dwEndA,dwCount;
  87.   base = (char*)malloc(dwSize*2);
  88.   ptr1 = base;
  89.   ptr2 = base + dwSize;
  90.   memset(ptr1,0,dwSize);
  91.   dwCount=0;
  92.  
  93.   dwBegA = GetTickCount();
  94.   for (i=0;i<10;i++)
  95.      {
  96.          dwBeg = GetTickCount();
  97.          memcpy(ptr2,ptr1,dwSize);
  98.          dwEnd = GetTickCount();
  99.          printf(": %6u Kb/Sec with %9u bytes on mem\n",dwSize/(1+dwEnd-dwBeg),dwSize);
  100.          dwCount += dwSize;
  101.      }
  102.   dwEndA = GetTickCount();
  103.   printf("= %6u Kb/Sec with %9u bytes on mem\n",dwCount/(1+dwEndA-dwBegA),dwCount);
  104. }
  105.  
  106. void txthelp()
  107. {
  108. printf("Usage : READFILE                            test memcopy speed\n" \
  109.        "        READFILE filespec                   test file reading (bypass cache)\n" \
  110.        "        READFILE filespec /d                test file reading + copy mem\n" \
  111.        "        READFILE filespec /c                test file reading + compute CRC32\n" \
  112.        "        READFILE filespec /s                test file reading + rec. dir parse\n" \
  113.        "        READFILE filespec /l                test file reading + listing output\n" \
  114.  
  115.        "\n"\
  116.        " filespec is file specification with joker, by example : *.*\n" \
  117.        " /d /c /s and /l options can be combined*.*\n"
  118.        );
  119. }
  120.  
  121. LPSTR GetOnlyJoker(LPSTR lpFn)
  122. {
  123. LPSTR lpRet=lpFn;
  124.   while ((*lpFn) != '\0')
  125.   {
  126.       if ((*lpFn)==':') lpRet = lpFn+1;
  127.       if ((*lpFn)=='\\') lpRet = lpFn+1;
  128.       lpFn++;
  129.   }
  130.   return lpRet;
  131. }
  132.  
  133. DWORD DoLoopFile(LPSTR szBeginPath,LPSTR lpFN,LPSTR ptr,LPSTR ptrcpy,
  134.                  DWORD dwSizeBlock,LPDWORD lpdwCrc,
  135.                  BOOL fList,
  136.                  BOOL fRecursive,BOOL fMap)
  137. {
  138. WIN32_FIND_DATA ffblk;
  139. HANDLE hFind;
  140. DWORD dwCount=0;
  141.   if ((hFind = FindFirstFile(lpFN,&ffblk)) == INVALID_HANDLE_VALUE)
  142.      return 0;
  143.   
  144.         do
  145.         {
  146.           if (!(ffblk.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  147.              dwCount += ReadAFile(szBeginPath,ffblk.cFileName,ffblk.nFileSizeLow,
  148.                                         ptr,ptrcpy,
  149.                                         dwSizeBlock,lpdwCrc,fList,fMap);
  150.           else if (fRecursive && (strcmp(ffblk.cFileName,".")!=0) && 
  151.                                  (strcmp(ffblk.cFileName,"..")!=0))
  152.           {
  153.           char szNewPath[MAX_PATH];
  154.           char szNewFN[MAX_PATH];
  155.             wsprintf(szNewPath,"%s%s\\",(LPSTR)szBeginPath,(LPSTR)ffblk.cFileName);
  156.             wsprintf(szNewFN,"%s%s",(LPSTR)szNewPath,GetOnlyJoker(lpFN));
  157.             DoLoopFile(szNewPath,szNewFN,ptr,ptrcpy,dwSizeBlock,lpdwCrc,fList,fRecursive,fMap); 
  158.           }
  159.  
  160.         } while (FindNextFile(hFind,&ffblk));
  161.   FindClose(hFind);
  162.   return dwCount;
  163. }
  164.  
  165. void main(int argc,char *argv[])
  166. {
  167. DWORD dwBeg,dwEnd,dwCount;
  168. char * ptr;
  169. char * ptrcpy=NULL;
  170. DWORD dwSizeBlock ;
  171. BOOL fDouble=FALSE;
  172. BOOL fCrc=FALSE;
  173. BOOL fList=FALSE;
  174. BOOL fRecursive=FALSE;
  175. BOOL fMap=FALSE;
  176. LPDWORD lpdwCrc=NULL;
  177. DWORD dwCrc;
  178. int i;
  179. char szBeginPath[ MAX_PATH ]; 
  180.  
  181.   InitializeCRCTable();
  182.   printf("ReadFile 1.10 - http://ourworld.compuserve.com/homepages/gvollant/readfile.htm\n");
  183.  
  184.   if (argc == 1)
  185.      {
  186.         txthelp();
  187.         testmem();
  188.         return;
  189.      }
  190.   dwSizeBlock = 65536L * 16;
  191.   ptr = (char*)malloc(dwSizeBlock) ;
  192.   if (ptr==NULL)
  193.      return;
  194.   i=2;
  195.   while (argv[i]!=NULL)
  196.     {
  197.     char c=*(argv[i]);
  198.     if ((c=='-') || (c=='/'))
  199.       c=*(argv[i]+1);
  200.     if ((c>='a') && (c<='z')) c-=0x20;
  201.  
  202.      if (((c)) == 'D')
  203.            fDouble=TRUE;
  204.      if (((c)) == 'S')
  205.            fRecursive=TRUE;
  206.      if (((c)) == 'C')
  207.            fCrc=TRUE;
  208.      if (((c)) == 'L')
  209.            fList=TRUE;
  210.      if (((c)) == 'M')
  211.            fMap=TRUE;
  212.          i++;
  213.     }
  214.              
  215.  
  216.     if (fCrc)
  217.       lpdwCrc = &dwCrc;
  218.  
  219.     if (fDouble)
  220.         ptrcpy = (char*)malloc(dwSizeBlock) ;
  221.  
  222.   if (ptrcpy!=NULL)
  223.      printf("Use double-buffering\n");
  224.  
  225.   dwBeg = GetTickCount();
  226.  
  227.   szBeginPath[0]='\0';
  228.   for (i=0;i<lstrlen(argv[1]);i++)
  229.   {
  230.   char c=*(argv[1]+i);
  231.     if ((c=='\\') || (c==':'))
  232.     {
  233.       memcpy(szBeginPath,argv[1],i+1);
  234.       szBeginPath[i+1]='\0';
  235.     }
  236.   }
  237.   dwCount = DoLoopFile(szBeginPath,argv[1],ptr,ptrcpy,dwSizeBlock,lpdwCrc,fList,fRecursive,fMap); 
  238.  
  239.   dwEnd = GetTickCount();
  240.   printf("Average = %6u Kb/Sec with %9u bytes (total : %u msec)\n",
  241.                         dwCount/(1+dwEnd-dwBeg),dwCount,dwEnd-dwBeg);
  242.   free(ptr);
  243.   if (ptrcpy != NULL)
  244.     free(ptrcpy);
  245. }
  246.  
  247.